#pragma once

#include<iostream>
#include<pthread.h>
#include<signal.h>
#include"Log.hpp"
#include"TcpServer.hpp"
#include"Protocol.hpp"
#include"Task.hpp"
#include"ThreadPool.hpp"

#define PORT 8081

class HttpServer{
    private:
        int port;
        bool stop;

    public:
        HttpServer(int _port = PORT):port(_port),stop(false)
        {}

        void InitServer()
        {
            // 如果是服务器正往sock中写入，而浏览器将连接关掉后，那么浏览器就会收到一个SIGPIPE的信号，
            // 此时服务器就会崩掉，因此我们在初始化服务器的时候需要忽略该SIGPIPE信号。
            signal(SIGPIPE,SIG_IGN);
            //tcp_server = TcpServer::getinstance(port);
        }

        void Loop()
        {
            TcpServer *tsvr = TcpServer::getinstance(port);
            LOG(INFO,"Loop begin");
            while(!stop){
                struct sockaddr_in* peer;
                socklen_t len = sizeof(peer);
                int sock = accept(tsvr->Sock(),(struct sockaddr*)&peer,&len);// 等待客户端连接
                if(sock < 0){
                    continue;
                }
                LOG(INFO,"Get a new link");
                Task task(sock);// 创建任务
                ThreadPool::getinstance()->PushTask(task);// 将任务添加到线程池中
            }
        }

        ~HttpServer()
        {}
};

